package co.com.bean.sede;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;

import co.com.smart.maestro.infraestructure.dto.ResponseJson;
import co.com.smart.maestro.infraestructure.dto.SedeDTO;
import co.com.smart.mapper.Mapper;
import co.com.smart.persistence.entity.SedeFacadeLocal;
import co.com.smart.persistence.entity.dto.SmartSede;
import co.com.smart.session.DelegateContextEJB;
import co.com.smart.utilidades.Constantes;

/**
 * Session Bean implementation class SedeBean
 */
@Stateless(mappedName = "ejb/SedeBean")
public class SedeBean implements SedeBeanLocal{
		
		private SedeFacadeLocal facade;
		
		@Resource
		private SessionContext sessionContext;
		
		public SedeBean(){
			facade = DelegateContextEJB.getSedeFacadeLocal();
		}
		
		

		@Override
		public ResponseJson insertarSede(SedeDTO sedeDTO) {

			ResponseJson response = new ResponseJson(); 
			try {
				sedeDTO.setSmFhingreso(new Date());
				sedeDTO.setSmCousuario(sessionContext.getCallerPrincipal().getName());
				facade.create(Mapper.mapperSmartSedeToDto(sedeDTO));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Sede almacenado.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Sede almacenado.");
			} catch (Throwable e) {
				System.err.println("Error insertando el Sede -> " + e.getMessage());
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible almacenar la Sede.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}

			return response ;
		}
		
		@Override
		public List<SedeDTO> consultarAllSede(){
			List<SedeDTO> sede = new ArrayList<SedeDTO>();
			for (SmartSede entity : facade.findAll()) {
				if(entity.getSmFhretiro() == null){
					sede.add(Mapper.mapperDtoToSmartSede(entity));
				}
			}

			return sede;
		}

		@Override
		public SedeDTO consultarSedeId(SedeDTO sedeDTO) {
			SedeDTO sede = new SedeDTO();
			
			SmartSede entity  = facade.find(sedeDTO.getSmScsede());
			if(entity != null && entity.getSmFhretiro() == null){
				sede = Mapper.mapperDtoToSmartSede(entity);
			}
			return sede;
		}

		@Override
		public ResponseJson editSede(SedeDTO sede) {
			ResponseJson response = new ResponseJson(); 
			try {
				sede.setSmFhmodificacion(new Date());
				sede.setSmCousuario(sessionContext.getCallerPrincipal().getName());
				facade.edit(Mapper.mapperSmartSedeToDto(sede));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Sede editado.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Sede editado.");
			} catch (Throwable e) {
				System.err.println("Error editando el Sede -> " + e.getMessage());
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible editar la Sede.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}

			return response ;
		}

		@Override
		public ResponseJson removeSede(SedeDTO sede,  boolean logic) {
			ResponseJson response = new ResponseJson(); 
			if(logic){
				try {
					sede.setSmFhretiro(new Date());
					sede.setSmFhmodificacion(new Date());
					sede.setSmCousuario(sessionContext.getCallerPrincipal().getName());
					facade.edit(Mapper.mapperSmartSedeToDto(sede));
					response.setCodigo(Constantes.StatusResponse.OK.getStatus());
					response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Sede inactivado");
					response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Sede inactivado.");
				} catch (Throwable e) {
					System.err.println("Error editando el Sede -> " + e.getMessage());
					response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
					response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible inactivar el Sede.");
					response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
				}
			}else{
				try {
					facade.remove(Mapper.mapperSmartSedeToDto(sede));
					response.setCodigo(Constantes.StatusResponse.OK.getStatus());
					response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Sede eliminado");
					response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Sede eliminado.");
				} catch (Throwable e) {
					System.err.println("Error eliminando el Sede -> " + e.getMessage());
					response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
					response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible eliminar el Sede.");
					response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
				}
			}
			return response ;
		}


		@Override
		public List<SedeDTO> consultarAllSede(SedeDTO json) {
			List<SedeDTO> sede  = new ArrayList<SedeDTO>();
			SmartSede filtro	= Mapper.mapperSmartSedeToDto(json);
			for (SmartSede entity : facade.consultarAllSede(filtro)) {
				if(entity.getSmFhretiro() == null){
					sede.add(Mapper.mapperDtoToSmartSede(entity));
				}
			}
			return sede;
		}
	}
